import axios from 'axios'
import utils from '@/config/utils'
import {
  message
} from "antd"
import {
  removeToken,
  getToken
} from "./cookie"
import qs from 'qs'

axios.defaults.baseURL = baseApi
axios.defaults.timeout = 5 * 60 * 1000
axios.defaults.headers.common['Authorization'] = getToken()

// 取消请求的集合
export const cancelAjaxMap = new Map();

/**
 * @description  请求全局拦截
 * @param  {boolean} transFormData  post方法 true转form提交表单方式
 * @param  {boolean} isCancel        是否取消上次请求，默认取消
 * */
axios.interceptors.request.use(
  config => {
    if (config.data && config.data.transFormData) {
      config.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8'
      delete config.data.transFormData
      config.data = qs.stringify(config.data)
      return config
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 添加响应拦截器
axios.interceptors.response.use(
  response => {
    return response
  },
  error => {
    if (axios.isCancel(error)) { // 取消请求的错误
      return new Promise(() => {})
    } else { // 请求出错了
      return Promise.reject(error)
    }
  }
)

/**
 * @description ajax 请求
 * @param {Object} ajaxData 配置 ajax 请求的键值对集合
 * @param {String} ajaxData.type 创建请求使用的方法
 * @param {String} ajaxData.url 请求服务器的 URL
 * @param {Object} ajaxData.data 与请求一起发送的 URL 参数
 */
function ajax(ajaxData = {}, apiHost) {
  if (apiHost) {
    axios.defaults.baseURL = apiHost;
    return;
  }

  if (ajaxData.transFormData) {
    ajaxData.data = {
      ...ajaxData.data,
      transFormData: true
    }
  }
  // 额外的配置项
  let extraOptions = {}
  // 默认取消请求
  const defaultCancel = ajaxData.hasOwnProperty("isCancel") ? ajaxData.isCancel : true

  if (defaultCancel) {
    // 取消上次请求
    let source = cancelAjaxMap.get(ajaxData.url)
    source && source.cancel(ajaxData.url)
    source = axios.CancelToken.source();
    extraOptions = {
      cancelToken: source.token
    }
    cancelAjaxMap.set(ajaxData.url, source)
  }

  return new Promise((resolve, reject) => {
    if (!utils.isObject(ajaxData)) {
      return reject(new Error('ajax请求配置错误'))
    }
    let method = ajaxData.type || 'GET'
    method = method.toLowerCase()
    let url = ajaxData.url
    const ajax = method === 'get' ? axios[method](url, {
      params: ajaxData.data,
      ...extraOptions
    }) : axios[method](url, ajaxData.data, extraOptions)

    ajax.then(res => {
        if (res.data.code === 200) {
          resolve(res.data)
        } else {
          res.message && message.error(res.message)
          reject(res)
        }
      })
      .catch(err => {
        let response = err.response
        if (response) {
          switch (response.status) {
            case 400:
            case 401:
              removeToken()
              toLogin()
              break
            case 500:
              message.error('服务器响应失败')
              break
            case 504:
              message.error('请求超时')
              break
          }
        }
        reject(err)
      })
  })
}

export const setAuthorization = (token) => {
  const _token = token || getToken()
  if (_token) {
    axios.defaults.headers.common["Authorization"] = _token;
  }
}

function toLogin() {
  window.location.href = window["loginUrl"]
}

export default ajax
